﻿#region Opis pliku
//-----------------------------------------------------------------------------
// GameScreen.cs
// Autor: Jan Czarnowski
// 22.10.2012
//-----------------------------------------------------------------------------
#endregion

#region Using...
using Microsoft.Xna.Framework;
using System;
#endregion

namespace pogra
{
    /// <summary>
    /// Bazowa klasa dla wszystkich stanów gry, które muszą z niej dziedziczyć.
    /// Zawiera podstawowe metody i pola wymagane do obsługi przez StateManager.
    /// </summary>
    public abstract class GameScreen
    {
        protected bool isExiting = false;

        #region właściwości

        /// <summary>
        /// Czy stan jest aktywny?
        /// </summary>
        public bool IsActive
        {
            get { return isActive; }
            set { isActive = value; }
        }

        bool isActive = true;

        /// <summary>
        /// Czy ekran jest pop-upem
        /// </summary>
        public bool IsPopup
        {
            get { return isPopup; }
            set { isPopup = value; }
        }

        bool isPopup = false;

        /// <summary>
        /// Menadzer, który obsługuje ten ekran.
        /// </summary>
        public ScreenManager ScreenManager
        {
            get { return m_screenManager; }
            internal set { m_screenManager = value; }
        }

        ScreenManager m_screenManager;

        #endregion

        #region inicjalizacja

        /// <summary>
        /// Wczytaj zawartość używaną przez ten stan
        /// </summary>
        public virtual void LoadContent() { }

        /// <summary>
        /// Zwolnij zawartość używaną przez ten stan
        /// </summary>
        public virtual void UnloadContent() { }

        #endregion

        #region metody draw i update

        /// <summary>
        /// Rysowanie stanu gry
        /// </summary>
        public abstract void Draw(GameTime gameTime);

        /// <summary>
        /// Aktualizacja stanu ekranu
        /// </summary>
        /// <param name="gameTime">Czas, który upłynął od ostatniego wywołania metody update</param>
        public abstract void Update(GameTime gameTime);

        #endregion

        #region metody publiczne
        /// <summary>
        /// Obsluga wejścia użytkownika
        /// </summary>
        /// <param name="input">Struktura przechowująca stan urządzeń wejścia</param>
        /// <param name="otherScreenHasFocus">Czy inny ekran ma focus</param>
        /// <param name="eventHandled">Czy event myszki został już obsłużony przez inny ekran</param>
        public virtual void HandleInput(InputState input, bool otherScreenHasFocus, ref bool eventHandled) { }

        /// <summary>
        /// Wyjście z ekranu
        /// </summary>
        public virtual void Exit()
        {
                ScreenManager.RemoveScreen(this);
        }
        #endregion
    }
}
